//1导入axios模块
import axios from 'axios'

//2 创建axios实列
const instance = axios.create({
  baseURL: 'http://toutiao.itheima.net/', //线上基地址
  timeout: 10000 //设置网络超时.10秒后作废
  // headers: {'X-Custom-Header': 'foobar'}  //自定义请求头
})

import { getItem, removeItem, setItem } from './token.js'
import { Toast } from 'vant'
/* 添加请求拦截器，自动上传token
因为我们是instance发请求所以就instance. */
instance.interceptors.request.use(
  function (config) {
    //如果用户有登录，就自动添加token
    if (getItem()) {
      config.headers.Authorization = 'Bearer ' + getItem().token
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

//3 导出模块
export default instance

/*
   添加响应拦截器 拦截token过期的401错误
*/
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    //console.dir(response)
    return response
  },
  async function (error) {
    //判断状态码是否401 与 token是否存在
    //判断状态码是不是401
    if (error.response.status === 401) {
      //是401的话先判断用户有没有token
      /* 如果觉得token过期控制台爆红看着不舒服，就可以手动清除控制台打印 */
      setTimeout(() => {
        console.clear()
      }, 1000)
      if (getItem()) {
        //进来就是true就是有,就说明token过期，需要请求刷新token
        /*使用try-catch捕捉异常  要与async配套使用*/
        try {
          //刷新token
          const tokenRes = await axios({
            method: 'put',
            url: 'http://toutiao.itheima.net/v1_0/authorizations',
            headers: {
              Authorization: `Bearer ${getItem().refresh_token}`
            }
          })
          //更新token,返回当前页
          console.log('更新了token:' + tokenRes)
          let newToken = getItem()
          newToken.token = tokenRes.data.data.token
          setItem(newToken)
          // 返回当前配置信息
          return instance(error.config)
        } catch (err) {
          //失败：说明refresh过期，需要重新登录
          //弹窗提示
          Toast.fail('请重新登录')
          //移除token
          removeItem()
          //跳转登录页
          router.push('/login')
        }
      } else {
        //1.2 没有token，说明用户未登录，需要重新登录
        //弹窗提示
        Toast.fail('请重新登录')
        //跳转登录页
        router.push('/login')
      }
    } else {
      //2.不是401，说明是其他问题，例如404路径错误，这个不做处理
    }

    return Promise.reject(error)
  }
)
